<?php

namespace app\common\services\table;

/**
 * 表格参数生成助手类
 */
class Column
{
    protected array $column = [];

    public static function make(): self
    {
        return new self();
    }

    /**
     * 字段
     * @param string $prop
     * @return $this
     */
    public function prop(string $prop): Column
    {
        $this->column['prop'] = $prop;
        return $this;
    }

    /**
     * 字段名
     * @param string $label
     * @return $this
     */
    public function label(string $label): Column
    {
        $this->column['label'] = $label;
        return $this;
    }

    /**
     * 是否显示
     * @param boolean $show
     * @return $this
     */
    public function show(bool $show = true): Column
    {
        $this->column['show'] = $show;
        return $this;
    }

    /**
     * 是否显示
     * @param string $width
     * @return $this
     */
    public function width(string $width = '100px'): Column
    {
        $this->column['width'] = $width;
        return $this;
    }

    /**
     * 设置渲染器类型
     *
     * 此方法用于指定列的渲染器类型。
     * 可接受的渲染器类型包括:
     * - icon          : 显示图标
     * - switch        : 显示开关控件
     * - image         : 显示单个图片
     * - images        : 显示图片列表
     * - tag           : 显示标签
     * - tags          : 显示标签列表
     * - url           : 显示链接
     * - datetime      : 显示日期时间
     * - buttons       : 显示按钮组
     * - color         : 显示颜色
     * - customRender  : 使用自定义渲染函数
     * - slot          : 使用插槽
     *
     * @param string $render 渲染器类型
     * @return $this 当前对象实例，用于链式调用
     */
    public function render(string $render): Column
    {
        $this->column['render'] = $render;
        return $this;
    }

    // TODO 按钮设置 编辑、删除、排序
    public function buttons(array $buttons): Column
    {
        $this->column['buttons'] = $buttons;
        return $this;
    }

    public function export($export = true)
    {
        $this->column['export'] = $export;
        return $this;
    }

    /**
     * 设置tag主题
     *
     * 当设置render=tag的时候，设置tag主题
     * - plain
     * - dark
     * - light
     *
     * @param string $effect 主题
     * @return $this 当前对象实例，用于链式调用
     */
    public function effect(string $effect): Column
    {
        $this->column['effect'] = $effect;
        return $this;
    }


    /**
     * 设置tag尺寸
     *
     * 当设置render=tag的时候，设置tag尺寸
     * - default
     * - small
     * - large
     *
     * @param string $size 尺寸
     * @return $this 当前对象实例，用于链式调用
     */
    public function size(string $size): Column
    {
        $this->column['size'] = $size;
        return $this;
    }

    /**
     * 设置tag样式
     *
     * 当设置render=tag的时候，设置tag不同值样式
     *
     * 例：['0'=>'success','-1'=>'error']
     *
     * @param array $custom 自定义样式
     * @return $this 当前对象实例，用于链式调用
     */
    public function custom(array $custom): Column
    {
        $this->column['custom'] = $custom;
        return $this;
    }

    /**
     * 设置自定义slot名称
     *
     * 设置后前端可以使用
     *
     * 例：name
     * <template #name="{ row }">
     *   {{ row.name }}
     * </template>
     *
     * @param string|boolean $slotName 如果为true，则slotName默认为：prop_slot
     * @return $this 当前对象实例，用于链式调用
     */
    public function slotName(bool|string $slotName = true): Column
    {
        $this->column['slotName'] = $slotName;
        return $this;
    }

    // TODO customRender、customTemplate

    /**
     * 设置render=url时候链接打开方式
     *
     * _blank(默认)、_self、copy
     *
     * @param string|boolean $target 如果为false则不跳转
     * @return $this 当前对象实例，用于链式调用
     */
    public function target(string|bool $target = '_blank'): Column
    {
        $this->column['target'] = $target;
        return $this;
    }

    // TODO url click

    /**
     * render=datetime时的格式化方式
     *
     * 例：yyyy-mm-dd hh:MM:ss
     *
     * @param string $timeFormat 时间格式化
     * @return $this 前对象实例，用于链式调用
     */
    public function timeFormat(string $timeFormat): Column
    {
        $this->column['timeFormat'] = $timeFormat;
        return $this;
    }

    /**
     * 设置默认值
     * 当获取的值为空或者不存在的时候显示
     * @param string|boolean|array|int|float $default 默认值
     * @return $this 前对象实例，用于链式调用
     */
    public function default(array|bool|float|int|string $default): Column
    {
        $this->column['default'] = $default;
        return $this;
    }


    /**
     * 当render=tag、switch、tags替换值的内容
     * 例：[1 => '开', 0 => '关']
     * @param array $replaceValue
     * @return $this 前对象实例，用于链式调用
     */
    public function replaceValue(array $replaceValue): Column
    {
        $this->column['replaceValue'] = $replaceValue;
        return $this;
    }

    // TODO  renderFormatter

    /**
     * 通用/公共搜索操作符[old]
     * false(关闭本字段公共搜索)、=、<>、>、>=、<、<=、LIKE、NOT LIKE、IN、NOT IN、RANGE、NOT RANGE、NULL、NOT NULL、FIND_IN_SET
     * @param false|string $operator
     * @return $this
     */
    public function operator(false|string $operator): Column
    {
        $this->column['operator'] = $operator;
        return $this;
    }

    /**
     * 通用/公共搜索操作符[new]
     * false(关闭本字段公共搜索)、=、<>、>、>=、<、<=、LIKE、NOT LIKE、IN、NOT IN、RANGE、NOT RANGE、NULL、NOT NULL、FIND_IN_SET
     * @param false|string $operator
     * @return $this
     */
    public function searchOperator(false|string $operator): Column
    {
        $this->column['operator'] = $operator;
        return $this;
    }

    /**
     * 通用搜索框的placeholder
     * @param string $operatorPlaceholder
     * @return $this
     */
    public function operatorPlaceholder(string $operatorPlaceholder): Column
    {
        $this->column['operatorPlaceholder'] = $operatorPlaceholder;
        return $this;
    }

    /**
     * 公共搜索渲染方式:当render=tag、switch时公共搜索也会渲染为下拉，数字会渲染为范围筛选，时间渲染为时间选择器等
     * @param $comSearchRender string 'remoteSelect' | 'select' | 'date' | 'customRender' | 'slot'
     * @return $this
     */
    public function comSearchRender($comSearchRender): Column
    {
        $this->column['comSearchRender'] = $comSearchRender;
        return $this;
    }

    /**
     * 公共搜索自定义渲染为slot时，slot的名称
     * @param $comSearchSlotName
     * @return $this
     */
    public function comSearchSlotName($comSearchSlotName): Column
    {
        $this->column['comSearchSlotName'] = $comSearchSlotName;
        $this->column['comSearchRender'] = 'slot';
        return $this;
    }

    /**
     * 公共搜索自定义搜索组件名
     * @param $comSearchComponent
     * @return $this
     */
    public function comSearchComponent($comSearchComponent): Column
    {
        $this->column['comSearchComponent'] = $comSearchComponent;
        $this->column['comSearchRender'] = 'customRender';
        return $this;
    }

    /**
     * 设置公共搜索自定义组件的Props
     * @param array $comSearchProps
     * @return $this
     */
    public function comSearchProps(array $comSearchProps): Column
    {
        $this->column['comSearchProps'] = $comSearchProps;
        return $this;
    }
    // TODO comSearchCustomRender

    /**
     * 搜索的label
     * @param string|false $comSearchLabel 为false不显示
     * @return $this
     */
    public function comSearchLabel(string|false $comSearchLabel = false): Column
    {
        $this->column['comSearchLabel'] = $comSearchLabel;
        return $this;
    }

    /**
     * 远程搜索，设置Select的远程搜索地址
     * @param $remote
     * @return $this
     */
    public function remote($remote): Column
    {
        $this->column['remoteUrl'] = $remote;
        return $this;
    }

    public function other($key, $value)
    {
        $this->column[$key] = $value;
        return $this;
    }

    public function others($column)
    {
        $this->column = array_merge($this->column, $column);
        return $this;
    }


    public function create(): array
    {
        return $this->column;
    }

}
